# 1.字典是什么？
# 字典，是Python开发中非常重要的一种数据类型。
# 字典 提供了一种特别的结构， 就是 存放 键值对 数据。这种结构使得字典，特别像 一张 表

# 2.字典的定义
# 字典对象定义用花括号 {} , 字典里面的 每个元素之间用 逗号 隔开。
# 每个元素都是一个键值对，键和值之间用 冒号 隔开。
members = {
    'account1': 13,
    'account2': 12
}

# 3.添加、修改、删除
# 定义一个空字典
members1 = {}

# 3.1.添加
members1['account1'] = 13
members1['account2'] = 12
members1['account3'] = 15
print(members1)  # {'account1': 13, 'account2': 12, 'account3': 15}

# 3.2.修改
members1['account2'] = 88
print(members1)  # {'account1': 13, 'account2': 88, 'account3': 15}

# 3.3.删除
# 方式1：使用字典对象的pop方法
val = members1.pop('account1')
print(members1)  # {'account2': 88, 'account3': 15}
print(val)  # 13，返回的是参数 key 对应的 value 对象

# 方式2：使用 del 关键字
del members1['account3']
print(members1)  # {'account2': 88}

# 4.判断字典是否存在某个key
# a in var   # 检查 a 是否在var 中存在，存在返回True，否则返回False
# a not in var   # 检查 a 是否不在var 中，存在返回 False，否则返回 True
members2 = {
    'account1': 13,
    'account2': 12
}
if 'account1' in members2:
    print('account1 在字典中存在')
if 'account88' not in members2:
    print('account88 不在字典中')

# 5.访问字典的所有元素
# 有时需要访问字典的每一个元素，也叫遍历字典。
# 通常使用字典对象的items方法。
# items方法，返回的是一个类似列表一样的对象，其中每个元素就是 键值组成的元组
members3 = {
    'account1': 13,
    'account2': 12,
    'account3': 15,
}
print(members3.items())  # [('account1', 13), ('account2', 12), ('account3', 15)]
for account, level in members3.items():
    print(f'account:{account}, level:{level}')

# 6.其他常用方法
# 6.1.得到所有的 key 和value 对象
# keys 方法， 返回的是 将字典 所有的 键 存入的 一个类似列表的对象
print(members3.keys())  # ['account1', 'account2', 'account3']
# values 方法， 返回的是 将字典 所有的 值 存入的 一个类似列表的对象
print(members3.values())  # [13, 12, 15]

# 6.2.清空字典
# clear 方法可以清空字典对象里面的所有元素
members4 = {
    'account1': 13,
    'account2': 12,
    'account3': 15,
}
members4.clear()
print(members4)  # {}

# 可能有的朋友就想，我们给字典对象重新赋值不也就等于清空字典吗？
# 比如：
members5 = {
    'account1': 13,
    'account2': 12,
    'account3': 15,
}
members5 = {}
print(members5)  # {}
# 这两种做法，虽然最后 members 变量指向的对象 都是一个空字典。 但是最大的区别就在于
# clear方法， members 变量 指向的还是原来的字典对象。
# 而 重新赋值的方法， members 变量 指向的 就是一个新的空字典对象。 原来的字典对象呢？ 因为没有被引用，就会被Python解释器在合适的时候 从内存中清除掉。

# 6.3.和另外一个字典合并
# 可以使用update方法
members6 = {
    'account1': 13,
    'account2': 12,
    'account3': 15,
}
another = {
    'account4': 13,
    'account5': 12,
}
members6.update(another)
print(members6)  # {'account1': 13, 'account2': 12, 'account3': 15, 'account4': 13, 'account5': 12}

# 6.4.得到字典元素的个数
# 如果需要得到字典元素的个数，就使用Python的内置函数 len 即可
members7 = {
    'account1': 13,
    'account2': 12,
    'account3': 15,
}
print(len(members7))  # 结果为3，表示字典中有3个元素

# 7.课后练习
# 7.1
# 在文件 0016_1.txt中，有3列数据，分别 保存了 游戏系统的用户名， 用户积分 ， 年龄
# 要求写一个程序，计算出同一姓氏的人的积分总和。
# 输出结果格式如下：
# 薛: 19142
# 王: 18514
# 尤: 11229
# 贾: 21677
# step1：read file
with open('asset/0016_1.txt', encoding='utf8') as f:
    lines = f.read().splitlines()

# step2：define a empty dictionary that receives the same last name and total coin
coinTable = {}

# step3：Traverse each line, judge and fill in the dictionary
for line in lines:
    # remove space of head and tail
    line = line.strip()

    # skip blank lines
    if not line:
        continue

    # split by space
    parts = line.split(' ')

    # get the name and coins of each line
    name = parts[0]
    coin = int(parts[-2])

    # get last name
    lastname = name[0]

    # judge whether there is historical data
    if lastname not in coinTable:
        # not，add
        coinTable[lastname] = coin
    else:
        # have，accumulate and update
        coinTable[lastname] += coin

# step4：print result
for key, value in coinTable.items():
    print(f'{key} ：{value}')

# 7.2
# 下面的字典里面记录了一个游戏系统中用户的信息。 其中key 是用户的ID， value 是另外一个字典，记录了用户名，用户等级和金币数量。
#
members8 = {
    1: {'name': '白月黑羽', 'level': 3, 'coins': 300},
    2: {'name': '短笛魔王', 'level': 5, 'coins': 330},
    3: {'name': '紫气一元', 'level': 6, 'coins': 340},
    4: {'name': '拜月主', 'level': 3, 'coins': 32200},
    5: {'name': '诸法空', 'level': 4, 'coins': 330},
    6: {'name': '暗光城主', 'level': 3, 'coins': 320},
    7: {'name': '心魔尊', 'level': 3, 'coins': 2300},
    8: {'name': '日月童子', 'level': 8, 'coins': 3450},
    9: {'name': '不死尸王', 'level': 3, 'coins': 324},
    10: {'name': '天池剑尊', 'level': 9, 'coins': 13100},
}
# 要求大家写一个程序，运行的时候先显示如下主菜单
# 请选择操作选项：
#    1 查看用户账号信息
#    2 添加用户
#    3 删除用户
#    4 列出所有用户信息
#    0 退出
# 如果用户选择 1 选项， 再次提示用户输入账号名， 用户输入账号后，显示该用户的 ID, 等级和 金币数量。
# 如果用户选择 2 选项， 提示用户输入账号名、等级、金币数量。 用户输入后，要检查该账号名是否已经存在，如果已经存在，则提示用户重新输入。如果用户输入的账号不存在，则添加该信息到字典中。
# 如果用户选择 3 选项， 提示用户输入账号名。 用户输入后，要检查该账号名是否已经存在，如果不存在，则提示用户重新输入。如果用户输入的账号存在，在用户字典中删除该账号。
# 如果用户选择 4 选项，则打印出当前用户表里所有用户的信息
# 如果用户选择 0 选项， 则退出程序。
# 只要不是选择退出，用户操作完后，再次进入主菜单，让用户再次选择。如此循环，直到用户选择0 退出。
